package br.com.softwareevaluation.managedBean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.context.RequestContext;

import br.com.softwareevaluation.bo.SoftwareBO;
import br.com.softwareevaluation.domain.Software;
import br.com.softwareevaluation.exceptions.BOException;
import br.com.softwareevaluation.exceptions.DAOException;

@ViewScoped
@ManagedBean(name = "cadastroSoftwareMB")
public class CadastroSoftwareMB implements Serializable {
	private static final long serialVersionUID = 1L;

	private SoftwareBO softwareBO = new SoftwareBO();
	
	private Software software = new Software();
	private Software softwareExibir = new Software();
	private List<Software> resultadoConsulta = new ArrayList<>();
	
	public void exibir(Software s) {
		this.softwareExibir = s;
	}
	
	public void alterar() {
		try {
			softwareBO.alterar(this.softwareExibir);
		} catch (BOException e) {
			System.out.println(e.getMessage());
		} catch (DAOException e) {
			e.printStackTrace();
			System.out.println("Ocorreu um erro ao tentar alterar o registro. Informe o erro ao administrador do sistema.");
		}
	}

	public void salvar() {
		try {
			softwareBO.salvar(software);
		} catch (BOException e) {
			System.out.println(e.getMessage());
		} catch (DAOException e) {
			e.printStackTrace();
			System.out.println("Ocorreu um erro ao tentar inserir o registro. Informe o erro ao administrador do sistema.");
		}
	}
	
	public void consultar() {
		try {
			resultadoConsulta = softwareBO.buscarTodos();
		} catch (BOException e) {
			System.out.println(e.getMessage());
		} catch (DAOException e) {
			e.printStackTrace();
			System.out.println("Ocorreu um erro ao tentar consultar o registro. Informe o erro ao administrador do sistema.");
		}
	}

	public void atualizarGraficoExibir() {
		RequestContext reqCtx = RequestContext.getCurrentInstance();
		reqCtx.addCallbackParam("avaliacaoManutenibilidade", softwareExibir.getManutenibilidade());
		reqCtx.addCallbackParam("avaliacaoFuncionalidade", softwareExibir.getFuncionalidade());
		reqCtx.addCallbackParam("avaliacaoQualidade", softwareExibir.getQualidade());
		reqCtx.addCallbackParam("avaliacaoConfiabilidade", softwareExibir.getConfiabilidade());
		reqCtx.addCallbackParam("avaliacaoPortabilidade", softwareExibir.getPortabilidade());
		reqCtx.addCallbackParam("avaliacaoEficiencia", softwareExibir.getEficiencia());
		reqCtx.addCallbackParam("avaliacaoUsabilidade", softwareExibir.getUsabilidade());
	}
	
	public void atualizarGrafico() {
		RequestContext reqCtx = RequestContext.getCurrentInstance();
		reqCtx.addCallbackParam("avaliacaoManutenibilidade", software.getManutenibilidade());
		reqCtx.addCallbackParam("avaliacaoFuncionalidade", software.getFuncionalidade());
		reqCtx.addCallbackParam("avaliacaoQualidade", software.getQualidade());
		reqCtx.addCallbackParam("avaliacaoConfiabilidade", software.getConfiabilidade());
		reqCtx.addCallbackParam("avaliacaoPortabilidade", software.getPortabilidade());
		reqCtx.addCallbackParam("avaliacaoEficiencia", software.getEficiencia());
		reqCtx.addCallbackParam("avaliacaoUsabilidade", software.getUsabilidade());
	}

	public Software getSoftware() {
		return software;
	}

	public void setSoftware(Software software) {
		this.software = software;
	}

	public List<Software> getResultadoConsulta() {
		consultar();
		return resultadoConsulta;
	}

	public void setResultadoConsulta(List<Software> resultadoConsulta) {
		this.resultadoConsulta = resultadoConsulta;
	}

	public Software getSoftwareExibir() {
		return softwareExibir;
	}

	public void setSoftwareExibir(Software softwareExibir) {
		this.softwareExibir = softwareExibir;
	}
}